#!/usr/bin/python
#-*-coding:utf-8-*-
#用来保存网页blog

"""
备份yahoo博客   作者：trouble.li
	blog [userName] [directory]

	userName:博客用户名称，即如果邮箱是 abc@yahoo.com.cn,则userName就是abc
	directory指定下载页面存放的路径
	程序按文章分类来下载页面，并为每一个类别建立文件夹

	参考了http://zeroliu.blogdriver.com/zeroliu/1189130.html
"""

import xmlrpclib
import os.path
import os
import codecs
import traceback
import urllib,urllib2,urllister
from HTMLParser import HTMLParser
from htmlentitydefs import *
import sys
from myhtml import myParser2
from myhtml import myParser3
from myhtml import myParser4

#初始化一些变量，要修改
usr='trouble.li'
dir='/home/trouble/python/'
urlBase='http://i.cn.yahoo.com/'
encoding='gb2312'
preUrl='' #保存前一url
catagory={}

#cd函数用于判断路径是否正确，如正确则改变当前工作路径
def cd(ss):
	try:
		os.chdir(ss)
		print '改变工作目录为'+ss
		return 0
	except:
		print '保存路径有误，请重新输入'
		return 1
	

#保存URL到一个文件，返回html
def saveUrlToFile(url,filename):
	#访问URL
	usock=urllib.urlopen(url)
	html=usock.read()
	usock.close()

	#以title作为文件名
	if filename=='':
		htmlpaser=myParser2()
		htmlpaser.feed(html)
		filename=htmlpaser.title.split('_')[0]
		#print '以title作为文件名,title:'+htmlpaser.title
		htmlpaser.close()
	
	#保存文件
	fp=file(filename,'wb')
	fp.write(html)
	fp.close();

	print 'saveUrl(%s) to File %s'%(url, filename)

	#返回
	return html

#对url进行筛选
def addUrl(url,blogs):
	if '/blog/p' in url and '#' not in url: # and '?' not in url:
		global preUrl
		if preUrl==url:return #避免保存同一个页面多次
		preUrl=url
		blogs.append(url)
		print '增加一篇文章：'+url
		
#取得博客文章分类
def getCategory():
	usock=urllib.urlopen(urlBase)
	html=usock.read()
	usock.close()
	
	htmlparser=myParser3()
	htmlparser.feed(html)
	catagory.update(htmlparser.cata)

#取得某分类所有文章链接
def getAllUrl(l_parser,blogs):
	l_url={}
	for url in l_parser.urls:
		if '/blog/l_' in url:
			usock=urllib.urlopen(url+'&bv=t') #bv=t:表示标题模式
			html=usock.read()
			usock.close()
			
			htmlparser=myParser4()
			htmlparser.url.clear() #为什么一定要这句？
			htmlparser.feed(html)
			l_url.update(htmlparser.url)
		else:
			addUrl(url,blogs)
	
	for url in l_url.values():
		blogs.append(url)
		print '增加一篇文章：'+url

if __name__=='__main__':
	if sys.argv[1:]:usr=sys.argv[1]
	if sys.argv[2:]:dir=sys.argv[2]
	dir=dir+usr+'-yahoo'
	urlBase=urlBase+usr+'/blog/'
	#保存目录
	if not os.path.exists(dir):
		print dir
		os.mkdir(dir)
	cd(dir)
	
	#catalogs={}
	#pages=[1,11,21,31]
	#for i in pages:
	#	catalogs['l_'+repr(i)+'/']='0摘要页面'+repr(i)
	
	#通过分类来整理
	count=0
	getCategory()
	for cata in catagory.keys():
		#print cata
		#html=saveUrlToFile(urlBase+cata,"0分类-"+catagory[cata])

		#为每一个分类创建一个目录
		tempdir=dir+'/'+catagory[cata]
		if not os.path.exists(tempdir):
			print tempdir
			os.mkdir(tempdir)
		cd(tempdir)
		usock=urllib.urlopen(urlBase+cata+'&bv=t') #bv=t:表示标题模式
		html=usock.read()
		#count+=1
		parser=urllister.URLLister()
		parser.feed(html)
		parser.close()

		#每一个分类可能有多页

		count1=0
		blogs=[]
		#取出这个分类的所有文章链接放到blogs里
		getAllUrl(parser,blogs)

		for url in blogs:
			saveUrlToFile(url,'')
			count+=1
			count1+=1

		print '\n----本类别有 %d 篇文章\n' %(count1)

	print '\n----Finished! Total %d posts be saved ' %(count)<pre></pre>